package cl.loso.melon.server.persistencia;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import cl.loso.melon.server.gae.PMF;
import cl.loso.melon.server.model.NegocioLVS;
import cl.loso.melon.server.model.SitioLVS;
import cl.loso.melon.server.model.VisitaLVS;

public class SitioLVSDAO {
	private static Log log = LogFactory.getLog(SitioLVSDAO.class);


	public static List<SitioLVS> obtener(NegocioLVS negociolvs) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    NegocioLVS negocio = null;
	    List<SitioLVS> detached=null;
	    Query query=null;
	    try {
	    	negocio = pm.getObjectById(NegocioLVS.class, negociolvs.getId());
	    	query = pm.newQuery(SitioLVS.class);
	    	query.setFilter("negocio == pnegocio");
	    	query.setOrdering("nombre ASC");//DESC
	    	query.declareParameters("NegocioLVS pnegocio");
	    	detached = (List<SitioLVS>)pm.detachCopyAll((List<SitioLVS>)query.execute(negocio));			
	    } catch (Exception e) {
	    	log.error(e.getMessage());	        
	    } finally {
	        pm.close();
	    }
	    return detached;		

	}
	
	public static List<SitioLVS> obtener() {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    List<SitioLVS> detached=null;
	    Query query=null;
	    try {
	    	query = pm.newQuery(SitioLVS.class);
	    	detached = (List<SitioLVS>)pm.detachCopyAll((List<SitioLVS>)query.execute());
	    } catch (Exception e) {
	    	log.error(e.getMessage());	        
	    } finally {
	        pm.close();
	    }
	    return detached;		
	}	
	
	public static void insertar(String idNegocio,String nombre, String fecha) {
	    Transaction tx=null;
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    try {

	    	NegocioLVS negocio=NegocioLVSDAO.getNegocioLVSbyId(Long.valueOf(idNegocio));
	    	
	    	SitioLVS sl=new SitioLVS();
		   	sl.setNegocio(negocio);
		   	sl.setNombre(nombre);
		   	sl.setFecha(fecha);	
		   	
		   	List<SitioLVS> lst=new ArrayList<SitioLVS>();
		   	lst.add(sl);
		   	
		   	negocio.setSitios(lst);
	    	tx = pm.currentTransaction();
	        tx.begin();

	    	pm.makePersistent(negocio);
	    	
	    	tx.commit();
	    } catch (Exception e) {
	    	log.error("insertar " + e.getMessage());
	    } finally {
	    	if (tx.isActive()) {
	            tx.rollback();
	        }
	    	if (!pm.isClosed()) {
                pm.close();
            }

	    }			
	}	
	
	public static SitioLVS getSitioLVSbyId(Long idNegocio, Long idSitio) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    SitioLVS sitio, detached = null;
	    try {
	    	Key k1 = KeyFactory.createKey(NegocioLVS.class.getSimpleName(), idNegocio);
	    	Key k2 = KeyFactory.createKey(k1,SitioLVS.class.getSimpleName(), idSitio);
	    	sitio = pm.getObjectById(SitioLVS.class, k2);
	        detached = pm.detachCopy(sitio);
	    } catch (Exception e) {
	    	log.error(e.getMessage());	        
	    } finally {
	        pm.close();
	    }
	    return detached;		

	}	
	
	public static void actualizar(Long idNegocio, Long idSitio, String nombre, String fecha) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    SitioLVS sitio = null;
	    try {
	    	Key k1 = KeyFactory.createKey(NegocioLVS.class.getSimpleName(), idNegocio);
	    	Key k2 = KeyFactory.createKey(k1,SitioLVS.class.getSimpleName(), idSitio);
	    	sitio = pm.getObjectById(SitioLVS.class, k2);
	    	sitio.setNombre(nombre);
	    	sitio.setFecha(fecha);
	    } catch (Exception e) {
	    	log.error(e.getMessage());	    	
	    } finally {
	        pm.close();
	    }		

	}	
	
	public static void borrar(Long idNegocio,Long idSitio) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    try {
	    	Key k1 = KeyFactory.createKey(NegocioLVS.class.getSimpleName(), idNegocio);
	    	Key k2 = KeyFactory.createKey(k1,SitioLVS.class.getSimpleName(), idSitio);
    	
	    	pm.deletePersistent(pm.getObjectById(SitioLVS.class, k2));
	    } catch (Exception e) {
	    	log.error(e.getMessage());	    	
	    } finally {
	        pm.close();
	    }		
		
	}	
	
	public static boolean existeVisita(String idNegocio,long idSitio) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Query query = null;
		List<VisitaLVS> visitas = null;
		try {
			Map<String, Object> pars = new HashMap<String, Object>();
			String queryStr = "negocio == :neg && sitio == :sit";
			pars.put("neg", Long.valueOf(idNegocio));
			pars.put("sit", idSitio);
			query = pm.newQuery(VisitaLVS.class);
			query.setFilter(queryStr);
			visitas = (List<VisitaLVS>) pm
					.detachCopyAll((List<VisitaLVS>) query.executeWithMap(pars));
			if(!visitas.isEmpty()) return true;
			
	    } catch (Exception e) {
	    	log.error(e.getMessage());	    	
	    } finally {
	        pm.close();
	    }
	    return false; 
	}
	
	public static boolean buscarNombre(String pnombre, String idNegocio) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    List<SitioLVS> detached = null;
	    boolean retorno=true;
	    try {
	    	Query query = pm.newQuery(SitioLVS.class,"nombre == pnombre");
	    	query.declareParameters("String pnombre");

	    	//detached = (List<SitioLVS>)pm.detachCopyAll((List<SitioLVS>) query.execute(pnombre));
	    	detached = (List<SitioLVS>)query.execute(pnombre.trim());
	    	int contador=0;
	    	if (detached.iterator().hasNext()) {
	            for (SitioLVS e : detached) {

	            	long idNegocioPapa=e.getNegocio().getId().longValue();//el papa
	            	long idNegocioSitio=Long.valueOf(idNegocio).longValue();
	            	if(idNegocioPapa==idNegocioSitio){
	            		contador++;
	            	}
	            }
	        } else {

	        }
	    	if(contador>0){
	    		retorno=false;
	    	}

    	
	    } catch (Exception e) {
	    	log.error(e.getMessage());	        
	    } finally {
	        pm.close();
	    }
	    return retorno;		

	}		
}
